1 using UnityEngine;
2 using UnityEngine.EventSystems;
3 using UnityEngine.UI;
4
5 namespace ProceduralToolkit.Examples
6 {
7 /// <summary>
8 /// Simple camera controller
9 /// </summary>
10 [RequireComponent(typeof (Image))]
11 public class CameraRotator : UIBehaviour, IDragHandler
12 {
13 public Transform cameraTransform;
14 public Transform target;
15 [Header("Position")]
16 public float distanceMin = 10;
17 public float distanceMax = 30;
18 public float yOffset = 0;
19 public float scrollSensitivity = 1000;
20 public float scrollSmoothing = 10;
21 [Header("Rotation")]
22 public float tiltMin = -85;
23 public float tiltMax = 85;
24 public float rotationSensitivity = 0.5f;
25 public float rotationSpeed = 20;
26
27 private float distance;
28 private float scrollDistance;
29 private float velocity;
30 private float lookAngle;
31 private float tiltAngle;
32 private Quaternion rotation;
33
34 protected override void Awake()
35 {
36 base.Awake();
37 tiltAngle = (tiltMin + tiltMax)/2;
38 distance = scrollDistance = (distanceMax + distanceMin)/2;
39
40 if (cameraTransform == null || target == null) return;
41
42 cameraTransform.rotation = rotation = Quaternion.Euler(tiltAngle, lookAngle, 0);
43 cameraTransform.position = CalculateCameraPosition();
44 }
45
46 private void LateUpdate()
47 {
48 if (cameraTransform == null || target == null) return;
49
50 if (cameraTransform.rotation != rotation)
51 {
52 cameraTransform.rotation = Quaternion.Lerp(cameraTransform.rotation, rotation,
53 Time.deltaTime*rotationSpeed);
54 }
55
56 float scroll = Input.GetAxis("Mouse ScrollWheel");
57 if (scroll != 0)
58 {
59 scrollDistance -= scroll*Time.deltaTime*scrollSensitivity;
60 scrollDistance = Mathf.Clamp(scrollDistance, distanceMin, distanceMax);
61 }
62
63 if (distance != scrollDistance)
64 {
65 distance = Mathf.SmoothDamp(distance, scrollDistance, ref velocity, Time.deltaTime*scrollSmoothing);
66 }
67
68 cameraTransform.position = CalculateCameraPosition();
69 }
70
71 public void OnDrag(PointerEventData eventData)
72 {
73 if (cameraTransform == null || target == null) return;
74
75 lookAngle += eventData.delta.x*rotationSensitivity;
76 tiltAngle -= eventData.delta.y*rotationSensitivity;
77 tiltAngle = Mathf.Clamp(tiltAngle, tiltMin, tiltMax);
78 rotation = Quaternion.Euler(tiltAngle, lookAngle, 0);
79 }
80
81 private Vector3 CalculateCameraPosition()
82 {
83 return target.position + cameraTransform.rotation*(Vector3.back*distance) + Vector3.up*yOffset;
84 }
85 }
86 }